﻿Imports Capa_de_Acceso_a_Datos
Imports Capa_de_Negocio
Public Class frmCargarReceta
    'Public tablaMedicamentos As DataTable
    Public tablaErroresReceta As DataTable

    Private medicamentoRp1 As Medicamento = Nothing
    Private medicamentoRp2 As Medicamento = Nothing
    Private medicamentoRp3 As Medicamento = Nothing
    Private detalleRecetaRp1Id As Integer = Constante.MENOSUNO
    Private detalleRecetaRp2Id As Integer = Constante.MENOSUNO
    Private detalleRecetaRp3Id As Integer = Constante.MENOSUNO
    Public farmaciaId As Integer
    Private medico As New Medico
    Public obraSocialXPlanId As Integer
    Public presentacionId As Integer
    Private recetaId As Integer = Constante.MENOSUNO
    Public medicamentoBuscado As Medicamento = Nothing
    Private idErrorFechaVenta As Integer = -1
    Private idErrorCoberturaRp1 = -1
    Private idErrorCoberturaRp2 = -1
    Private idErrorCoberturaRp3 = -1
    Private idError As Integer = 1

    Private Sub CargaRecetarioSolidario_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        frmListadoRecetas.Show()
    End Sub


    Private Sub Prueba_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'tablaMedicamentos = MedicamentoDAO.obtenerMedicamentos(0)
        tablaErroresReceta = ErrorRecetaDAO.grillaErrorReceta(recetaId)
        cargarComboTipoMatricula()
    End Sub

#Region "Rutinas de Load"

    Private Sub cargarComboTipoMatricula()
        cboTipoMatriculaMedico.DataSource = TipoMatriculaMedicoDAO.obtenerTiposMatriculasMedicos(0)
        cboTipoMatriculaMedico.DisplayMember = "TipoMatriculaMedicoAbreviatura"
        cboTipoMatriculaMedico.ValueMember = "TipoMatriculaMedicoId"
        cboTipoMatriculaMedico.SelectedIndex = 0
    End Sub

#End Region

#Region "Búsquedas y Cargas"

    Public Sub cargarMedico(ByVal MedicoId As Integer, ByVal MedicoApeliido As String, ByVal MedicoNombre As String, ByVal MedicoNroMatricula As Integer, ByVal TipoMatriculaMedicoId As Integer, ByVal EspecialidadMecicaId As Integer, ByVal EspecialidadMedicaNombre As String)
        medico = New Medico(MedicoId, MedicoNombre, MedicoApeliido, MedicoNroMatricula, TipoMatriculaMedicoId, EspecialidadMecicaId)
        'Cargamos los datos del medico en el txaMedico
        txtMatriculaMedico.Text = medico.NroMatricula
        cboTipoMatriculaMedico.SelectedValue = TipoMatriculaMedicoId
        txaDatosMedico.Text = medico.Apellido & " " & medico.Nombre & vbCrLf & EspecialidadMedicaNombre
    End Sub

    Private Sub buscarTxtMedicamento(ByRef txtMedicamento As TextBox) ', ByRef medicamentoBuscado As Medicamento)
        Dim tabla As New DataTable
        'Variable dónde guardamos el texto que le pasaremos a la búsqueda
        Dim textoBuscar As String = txtMedicamento.Text

        'Si el numero corresponde al de un troquel
        If (IsNumeric(txtMedicamento.Text) And txtMedicamento.Text.Count <= 7) Then

            'Buscamos txtMedicamento en la BD
            tabla = MedicamentoDAO.buscarMedicamento(MedicamentoDAO.TROQUEL, txtMedicamento.Text, "", "")

            Select Case tabla.Rows.Count
                Case 1
                    'Cargamos el Medicamento
                    With tabla.Rows(0)
                        medicamentoBuscado = New Medicamento(.Item("MedicamentoId"), .Item("MedicamentoNombre"), .Item("MedicamentoTroquel"), .Item("MedicamentoCodigoBarra"), .Item("MedicamentoPresentacion"), .Item("MedicamentoImporte"), .Item("LaboratorioId"), .Item("TamanoMedicamentoId"), .Item("AccionFarmacologicaId"), .Item("MonodrogaId"))
                        txtMedicamento.Text = medicamentoBuscado.Troquel
                    End With
                    Exit Sub
                Case 0
                    MsgBox("No se encontraron medicamentos con el número de troquel indicado, por favor búsquelo manualmente.", MsgBoxStyle.OkOnly, "Medicamento no encontrado")
                    textoBuscar = ""
                Case Is > 1
                    'Si se encontró mas de un medicamento con ese troquel
                    MsgBox("Hay más de un medicamento con el número de troquel indicado, por favor búsquelo manualmente.", MsgBoxStyle.OkOnly, "Medicamento no encontrado")
                    textoBuscar = ""
            End Select

        End If

        'Si el nro ingresado contiene mas de 7 caracteres corresponde a un CODIGO DE BARRA
        If (IsNumeric(txtMedicamento.Text) And txtMedicamento.Text.Count > 7) Then

            'Buscamos el txtMedicamento en la BD por el nro de CODIGO DE BARRA
            tabla = MedicamentoDAO.buscarMedicamento(MedicamentoDAO.CODIGO_BARRA, -1, txtMedicamento.Text, "")

            Select Case tabla.Rows.Count
                Case 1
                    'Cargamos el Medicamento
                    With tabla.Rows(0)
                        medicamentoBuscado = New Medicamento(("MedicamentoId"), ("MedicamentoNombre"), ("MedicamentoTroquel"), ("MedicamentoCodigoBarra"), ("MedicamentoPresentacion"), ("MedicamentoImporte"), ("LaboratorioId"), ("TamanoMedicamentoId"), ("AccionFarmacologicaId"), ("MonodrogaId"))
                        txtMedicamento.Text = medicamentoBuscado.Troquel
                    End With
                    Exit Sub
                Case 0
                    'Si se encontró mas de un medicamento con ese codigo de barras
                    MsgBox("No se encontraron medicamentos con el código de barras indicado, por favor búsquelo manualmente.", MsgBoxStyle.OkOnly, "Medicamento no encontrado")
                    textoBuscar = ""
                Case Is > 1
                    'Si se encontró mas de un medicamento con ese codigo de barras
                    MsgBox("Hay más de un medicamento con el código de barras indicado, por favor búsquelo manualmente.", MsgBoxStyle.OkOnly, "Medicamento no encontrado")
                    textoBuscar = ""
            End Select

        End If

        txtMedicamento.Text = ""
        'Si se llego hasta este punto indica que no se ingreso un numero, sino el nombre del txtMedicamento o parte de él
        abrirBusqueda(textoBuscar) ', medicamentoBuscado)

    End Sub

    Private Sub buscarCobertura(ByVal medicamentoId As Integer, ByVal fecha As DateTime, ByRef txtCobertura As TextBox)
        Dim cobertura As Double = MedicamentoDAO.coberturaMedicamento(medicamentoId, obraSocialXPlanId, fecha)
        If cobertura <> -1 Then
            txtCobertura.Text = cobertura
        End If
    End Sub

    Private Sub abrirBusqueda(ByVal textoBuscar As String) ', ByRef medicamentoBuscado As Medicamento)
        Dim busqueda As New frmBuscarMedicamento(textoBuscar)
        busqueda.frmLlamada = Me.Name
        busqueda.ShowDialog()
        'busqueda.cargarBusqueda(textoBuscar)
    End Sub

    Private Function estadoReceta() As Integer
        'Si la receta no tiene errores cargados está correcta
        If tablaErroresReceta.Rows.Count = 0 Then
            Return EstadoRecetaDAO.CORRECTA
        End If
        For Each errorReceta As DataRow In tablaErroresReceta.Rows
            'Si la receta tiene al menos una receta sin corregir está Pendiente de Correccion
            If errorReceta("ErrorRecetaCorregida") = False Then
                Return EstadoRecetaDAO.PENDIENTE_CORRECCION
            End If
        Next

        'Si se llegó a este punto la receta tiene todos sus errores corregidos
        Return EstadoRecetaDAO.CORREGIDA
    End Function

#End Region

#Region "Calculos de importes"

    Private Sub calcularImportes()
        'Calculamos los subtotales
        calcularSubtotales()

        'Calculamos el monto de cobertura de cada rp
        Dim coberturaRp1 As Double = IIf(CDbl(txtCoberturaRp1.Text) = 0, 0, CDbl(txtSubtotalRp1.Text) * CDbl(txtCoberturaRp1.Text) / 100)
        Dim coberturaRp2 As Double = IIf(CDbl(txtCoberturaRp2.Text) = 0, 0, CDbl(txtSubtotalRp2.Text) * CDbl(txtCoberturaRp2.Text) / 100)
        Dim coberturaRp3 As Double = IIf(CDbl(txtCoberturaRp3.Text) = 0, 0, CDbl(txtSubtotalRp3.Text) * CDbl(txtCoberturaRp3.Text) / 100)

        txtTotalFacturado.Text = Utilidades.darFormatoDouble(CDbl(txtSubtotalRp1.Text) + CDbl(txtSubtotalRp2.Text) + CDbl(txtSubtotalRp3.Text))
        txtOS.Text = Utilidades.darFormatoDouble(coberturaRp1 + coberturaRp2 + coberturaRp3)
        txtImporteAfiliado.Text = Utilidades.darFormatoDouble(CDbl(txtTotalFacturado.Text) - CDbl(txtOS.Text))
    End Sub

    Private Sub calcularSubtotales()
        'Damos formato a los precios unitarios
        txtSubtotalRp1.Text = Utilidades.darFormatoDouble(txtSubtotalRp1.Text)
        txtSubtotalRp2.Text = Utilidades.darFormatoDouble(txtSubtotalRp2.Text)
        txtSubtotalRp3.Text = Utilidades.darFormatoDouble(txtSubtotalRp3.Text)
        'Si hay medicamentos cargados calculamos los subtotales, si no los hay ponemos 0.00
        If Not medicamentoRp1 Is Nothing Then
            txtSubtotalRp1.Text = Utilidades.darFormatoDouble((txtCantidadRp1.Text * txtPrecioRp1.Text))
        End If
        If Not medicamentoRp2 Is Nothing Then
            txtSubtotalRp2.Text = Utilidades.darFormatoDouble((txtCantidadRp2.Text * txtPrecioRp2.Text))
        End If
        If Not medicamentoRp3 Is Nothing Then
            txtSubtotalRp3.Text = Utilidades.darFormatoDouble((txtCantidadRp3.Text * txtPrecioRp3.Text))
        End If
    End Sub

#End Region

#Region "Eventos LostFocus"

    Private Sub txtFechaReceta_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtFechaReceta.LostFocus
        If txtFechaReceta.Text = "  /  /" Then
            Exit Sub
        End If

        'Si no se ingreso una fecha en la fecha de receta
        If Not IsDate(txtFechaReceta.Text) Then
            MsgBox("La fecha de receta ingresada no tiene el formato de fecha correcto.", MsgBoxStyle.OkOnly, "Error de formato")
            txtFechaReceta.Focus()
            Exit Sub
        End If
        'Si la fecha ingresada es mayor a la fecha actual
        If CDate(txtFechaReceta.Text) > Today Then
            MsgBox("La fecha de receta ingresada no puede ser mayor a la fecha actual de sistema.", MsgBoxStyle.OkOnly, "Error de fecha")
            txtFechaReceta.Focus()
            Exit Sub
        End If

        'si la fecha de receta es mayor que la fecha de venta
        If txtFechaVenta.Text = "  /  /" Then
            Exit Sub
        End If
        If CDate(txtFechaVenta.Text) < CDate(txtFechaReceta.Text) And idErrorFechaVenta = -1 Then
            'MsgBox("La fecha de venta no puede ser anterior a la fecha de receta.", MsgBoxStyle.OkOnly, "Fecha de venta anterior a Fecha de Receta")
            'Agregamos el error automáticamente (codigo de error 4 "Fecha de Venta")
            idErrorFechaVenta = agregarErrorReceta("Fecha de venta anterior a fecha de prescripción.", "", False, 4, "Fecha de Venta", "txtFechaVenta")
        ElseIf idErrorFechaVenta = -1 Then
            'Si la fecha está bien quitamos el error
            quitarError("txtFechaVenta", idErrorFechaVenta)
            idErrorFechaVenta = -1
        End If
    End Sub

    Private Sub txtFechaVenta_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtFechaVenta.LostFocus

        If txtFechaVenta.Text = "  /  /" Then
            Exit Sub
        End If


        'Si no se ingreso una fecha en la fecha de venta
        If Not IsDate(txtFechaVenta.Text) Then
            MsgBox("La fecha de venta ingresada no tiene el formato de fecha correcto.", MsgBoxStyle.OkOnly, "Error de formato")
            txtFechaVenta.Focus()
            Exit Sub
        End If

        'Si la fecha ingresada es mayor a la fecha actual
        If CDate(txtFechaVenta.Text) > Today Then
            MsgBox("La fecha de venta ingresada no puede ser mayor a la fecha actual de sistema.", MsgBoxStyle.OkOnly, "Error de fecha")
            txtFechaVenta.Focus()
            Exit Sub
        End If

        'si la fecha de receta es mayor que la fecha de venta
        If CDate(txtFechaVenta.Text) < CDate(txtFechaReceta.Text) And idErrorFechaVenta = -1 Then
            'MsgBox("La fecha de venta no puede ser anterior a la fecha de receta.", MsgBoxStyle.OkOnly, "Fecha de venta anterior a Fecha de Receta")
            'Agregamos el error automáticamente (codigo de error 4 "Fecha de Venta")
            idErrorFechaVenta = agregarErrorReceta("Fecha de venta anterior a fecha de prescripción.", "", False, 4, "Fecha de Venta", "txtFechaVenta")
        ElseIf idErrorFechaVenta = -1 Then
            'Si la fecha está bien quitamos el error
            quitarError("txtFechaVenta", idErrorFechaVenta)
            idErrorFechaVenta = -1
        End If
    End Sub

    Private Sub txtCantidadRp1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtCantidadRp1.LostFocus
        If medicamentoRp1 Is Nothing Then
            txtCantidadRp1.Text = ""
            Exit Sub
        End If

        If Not IsNumeric(txtCantidadRp1.Text) Then
            txtCantidadRp1.Text = 1
            MsgBox("La cantidad entregada debe ser un número entero", MsgBoxStyle.OkOnly, "Error en cantidad")
            Exit Sub
        End If

        calcularImportes()
    End Sub

    Private Sub txtCantidadRp2_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtCantidadRp2.LostFocus
        If medicamentoRp2 Is Nothing Then
            txtCantidadRp2.Text = ""
            Exit Sub
        End If

        If Not IsNumeric(txtCantidadRp2.Text) Then
            txtCantidadRp2.Text = 1
            MsgBox("La cantidad entregada debe ser un número entero", MsgBoxStyle.OkOnly, "Error en cantidad")
            Exit Sub
        End If

        calcularImportes()
    End Sub

    Private Sub txtCantidadRp3_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtCantidadRp3.LostFocus
        If medicamentoRp3 Is Nothing Then
            txtCantidadRp3.Text = ""
            Exit Sub
        End If

        If Not IsNumeric(txtCantidadRp3.Text) Then
            txtCantidadRp3.Text = 1
            MsgBox("La cantidad entregada debe ser un número entero", MsgBoxStyle.OkOnly, "Error en cantidad")
            Exit Sub
        End If

        calcularImportes()
    End Sub

    Private Sub txtPrecioRp1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtPrecioRp1.LostFocus
        If medicamentoRp1 Is Nothing Then
            txtPrecioRp1.Text = ""
            Exit Sub
        End If

        If Not IsNumeric(txtPrecioRp1.Text) Then
            MsgBox("El precio debe ser un número valido", MsgBoxStyle.OkOnly, "Error en precio")
            txtPrecioRp1.Focus()
            Exit Sub
        End If

        calcularImportes()
        txtPrecioRp1.Text = Utilidades.darFormatoDouble(txtPrecioRp1.Text)
        medicamentoRp1.Importe = txtPrecioRp1.Text
    End Sub

    Private Sub txtPreciorp2_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtPrecioRp2.LostFocus
        If medicamentoRp2 Is Nothing Then
            txtPrecioRp2.Text = ""
            Exit Sub
        End If

        If Not IsNumeric(txtPrecioRp2.Text) Then
            MsgBox("El precio debe ser un número valido", MsgBoxStyle.OkOnly, "Error en precio")
            txtPrecioRp2.Focus()
            Exit Sub
        End If

        calcularImportes()
        txtPrecioRp2.Text = Utilidades.darFormatoDouble(txtPrecioRp2.Text)
        medicamentoRp2.Importe = txtPrecioRp2.Text
    End Sub

    Private Sub txtPreciorp3_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtPrecioRp3.LostFocus
        If medicamentoRp3 Is Nothing Then
            txtPrecioRp3.Text = ""
            Exit Sub
        End If

        If Not IsNumeric(txtPrecioRp3.Text) Then
            MsgBox("El precio debe ser un número valido", MsgBoxStyle.OkOnly, "Error en precio")
            txtPrecioRp3.Focus()
            Exit Sub
        End If

        calcularImportes()
        txtPrecioRp3.Text = Utilidades.darFormatoDouble(txtPrecioRp3.Text)
        medicamentoRp3.Importe = txtPrecioRp3.Text
    End Sub

    Private Sub txtTroquelRp1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtTroquelRp1.LostFocus
        If txtTroquelRp1.Text = Constante.VACIO Then
            Exit Sub
        End If

        medicamentoBuscado = medicamentoRp1
        buscarTxtMedicamento(txtTroquelRp1)
        medicamentoRp1 = medicamentoBuscado
        'Si hay cargado un medicamento en rp1
        If Not medicamentoRp1 Is Nothing Then
            'Buscamos la cobertura del medicamento encontrado
            buscarCobertura(medicamentoRp1.Id, Today, txtCoberturaRp1)

            'Cargamos los datos del medicamento
            txtTroquelRp1.Text = medicamentoRp1.Troquel
            txtPrecioRp1.Text = Utilidades.darFormatoDouble(medicamentoRp1.Importe)
            txtCantidadRp1.Text = 1
            txaPrescripcionRp1.Text = medicamentoRp1.Nombre & vbCrLf & medicamentoRp1.Presentacion

            'si la cobertura es 0%
            If txtCoberturaRp1.Text = 0 Then
                'Codigo de error 25 "Rp1 Fuera Vademecum"
                idErrorCoberturaRp1 = agregarErrorReceta("Medicamento no cubierto por este plan de Obra Social", "", False, 25, "Rp1 Fuera Vademecum", "txtCoberturaRp1")
            End If
            calcularImportes()

            'Bloqueamos el textbox para que no se pueda modificar el medicamento a menos que se haga doble click
            txtTroquelRp1.TabStop = False
            txtTroquelRp1.ReadOnly = True
        End If

    End Sub

    Private Sub txtTroquelRp2_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtTroquelRp2.LostFocus
        If txtTroquelRp2.Text = Constante.VACIO Then
            Exit Sub
        End If


        medicamentoBuscado = medicamentoRp2
        buscarTxtMedicamento(txtTroquelRp2)
        medicamentoRp2 = medicamentoBuscado
        'Si hay cargado un medicamento en rp2
        If Not medicamentoRp2 Is Nothing Then
            'Buscamos la cobertura del medicamento encontrado
            buscarCobertura(medicamentoRp2.Id, Today, txtCoberturaRp2)

            'Cargamos los datos del medicamento
            txtTroquelRp2.Text = medicamentoRp2.Troquel
            txtPrecioRp2.Text = Utilidades.darFormatoDouble(medicamentoRp2.Importe)
            txtCantidadRp2.Text = 1
            txaPrescripcionRp2.Text = medicamentoRp2.Nombre & vbCrLf & medicamentoRp2.Presentacion
            'si la cobertura es 0%
            If txtCoberturaRp2.Text = 0 Then
                'Codigo de error 26 "Rp1 Fuera Vademecum"
                idErrorCoberturaRp2 = agregarErrorReceta("Medicamento no cubierto por este plan de Obra Social", "", False, 26, "Rp2 Fuera Vademecum", "txtCoberturaRp2")
            End If
            calcularImportes()

            'Bloqueamos el textbox para que no se pueda modificar el medicamento a menos que se haga doble click
            txtTroquelRp2.TabStop = False
            txtTroquelRp2.ReadOnly = True
        End If
    End Sub

    Private Sub txtTroquelRp3_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtTroquelRp3.LostFocus
        If txtTroquelRp3.Text = Constante.VACIO Then
            Exit Sub
        End If

        medicamentoBuscado = medicamentoRp3
        buscarTxtMedicamento(txtTroquelRp3)
        medicamentoRp3 = medicamentoBuscado
        'Si hay cargado un medicamento en rp3
        If Not medicamentoRp3 Is Nothing Then
            'Buscamos la cobertura del medicamento encontrado
            buscarCobertura(medicamentoRp3.Id, Today, txtCoberturaRp3)

            'Cargamos los datos del medicamento
            txtTroquelRp3.Text = medicamentoRp3.Troquel
            txtPrecioRp3.Text = Utilidades.darFormatoDouble(medicamentoRp3.Importe)
            txtCantidadRp3.Text = 1
            txaPrescripcionRp3.Text = medicamentoRp3.Nombre & vbCrLf & medicamentoRp3.Presentacion
            'si la cobertura es 0%
            If txtCoberturaRp3.Text = 0 Then
                'Codigo de error 27 "Rp1 Fuera Vademecum"
                idErrorCoberturaRp3 = agregarErrorReceta("Medicamento no cubierto por este plan de Obra Social", "", False, 27, "Rp3 Fuera Vademecum", "txtCoberturaRp3")
            End If
            calcularImportes()

            'Bloqueamos el textbox para que no se pueda modificar el medicamento a menos que se haga doble click
            txtTroquelRp3.TabStop = False
            txtTroquelRp3.ReadOnly = True
        End If
    End Sub

    Private Sub txtMatriculaMedico_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtMatriculaMedico.LostFocus

        If txtMatriculaMedico.Text = Constante.VACIO Then
            'No se ingreso nada, dejamos salir
            Exit Sub
        End If

        'Si no se ingresó un número
        If Not IsNumeric(txtMatriculaMedico.Text) Then
            MsgBox("Debe ingresar el número de matrícula provincial del médico. Si desea buscar por nombre o apellido presione el botón buscar.", MsgBoxStyle.OkOnly, "Error en matrícula")
            Exit Sub
        End If

        'Buscamos el médico por la MP
        Dim tablaMedico As DataTable = MedicoDAO.buscarMedicos(2, Constante.VACIO, Constante.VACIO, txtMatriculaMedico.Text, cboTipoMatriculaMedico.SelectedValue)
        Select Case tablaMedico.Rows.Count
            Case 0
                MsgBox("No se encontró ningún médico con la MP ingresada", MsgBoxStyle.OkOnly, "Médico no encontrado")
                Dim busquedaMedico As New frmBuscarMedico
                busquedaMedico.frmLlamada = Me.Name
                busquedaMedico.ShowDialog()
                Exit Sub
            Case 1
                'Se encontró un sólo médico para la matrícula ingresada
                'Cargamos el médico
                cargarMedico(tablaMedico.Rows(0)("MedicoId"), tablaMedico.Rows(0)("MedicoApellido"), tablaMedico.Rows(0)("MedicoNombre"), tablaMedico.Rows(0)("MedicoNroMatricula"), tablaMedico.Rows(0)("TipoMatriculaMedicoId"), tablaMedico.Rows(0)("EspecialidadMedicaId"), tablaMedico.Rows(0)("EspecialidadMedicaNombre"))
                Exit Sub
            Case Else
                MsgBox("Hay más de un médico con la MP ingresada, intente buscarlo por nombre", MsgBoxStyle.OkOnly, "Médico no encontrado")
                txtMatriculaMedico.Focus()
                Exit Sub
        End Select
    End Sub

#End Region

#Region "Eventos DoubleClick"

    Private Sub txtTroquelRp1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtTroquelRp1.DoubleClick
        'Si está deshabilitado lo habilitamos
        If txtTroquelRp1.ReadOnly = True Then
            txtTroquelRp1.ReadOnly = False
            txtTroquelRp1.TabStop = True
        End If
    End Sub

    Private Sub txtTroquelrp2_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtTroquelRp2.DoubleClick
        'Si está deshabilitado lo habilitamos
        If txtTroquelRp2.ReadOnly = True Then
            txtTroquelRp2.ReadOnly = False
            txtTroquelRp2.TabStop = True
        End If
    End Sub

    Private Sub txtTroquelrp3_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtTroquelRp3.DoubleClick
        'Si está deshabilitado lo habilitamos
        If txtTroquelRp3.ReadOnly = True Then
            txtTroquelRp3.ReadOnly = False
            txtTroquelRp3.TabStop = True
        End If
    End Sub

#End Region

#Region "Eventos KeyPress"

    Private Sub txtPrecioRp1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtPrecioRp1.KeyPress
        'Si se presiono un punto ponemos una coma
        e.KeyChar = Utilidades.cambiarPuntoPorComa(e.KeyChar)
    End Sub

    Private Sub txtPreciorp2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtPrecioRp2.KeyPress
        'Si se presiono un punto ponemos una coma
        e.KeyChar = Utilidades.cambiarPuntoPorComa(e.KeyChar)
    End Sub

    Private Sub txtPreciorp3_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtPrecioRp3.KeyPress
        'Si se presiono un punto ponemos una coma
        e.KeyChar = Utilidades.cambiarPuntoPorComa(e.KeyChar)
    End Sub

#End Region

#Region "Botónes con imagen"

    Private Sub btnEliminarRp1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminarRp1.Click
        medicamentoRp1 = Nothing
        detalleRecetaRp1Id = Constante.MENOSUNO
        txtTroquelRp1.Text = ""
        txtCantidadRp1.Text = ""
        txtPrecioRp1.Text = ""
        txtSubtotalRp1.Text = "0,00"
        txtCoberturaRp1.Text = "0"
        txaPrescripcionRp1.Text = ""
        txtTroquelRp1.TabStop = True
        txtTroquelRp1.ReadOnly = False

        quitarError("txtCoberturaRp1", idErrorCoberturaRp1)
        idErrorCoberturaRp1 = -1

        calcularImportes()
    End Sub

    Private Sub btnEliminarRp2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminarRp2.Click
        medicamentoRp2 = Nothing
        detalleRecetaRp2Id = Constante.MENOSUNO
        txtTroquelRp2.Text = ""
        txtCantidadRp2.Text = ""
        txtPrecioRp2.Text = ""
        txtSubtotalRp2.Text = "0,00"
        txtCoberturaRp2.Text = "0"
        txaPrescripcionRp2.Text = ""
        txtTroquelRp2.TabStop = True
        txtTroquelRp2.ReadOnly = False

        quitarError("txtCoberturaRp2", idErrorCoberturaRp2)
        idErrorCoberturaRp2 = -1

        calcularImportes()
    End Sub

    Private Sub btnEliminarrp3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminarRp3.Click
        medicamentoRp3 = Nothing
        detalleRecetaRp3Id = Constante.MENOSUNO
        txtTroquelRp3.Text = ""
        txtCantidadRp3.Text = ""
        txtPrecioRp3.Text = ""
        txtSubtotalRp3.Text = "0,00"
        txtCoberturaRp3.Text = "0"
        txaPrescripcionRp3.Text = ""
        txtTroquelRp3.TabStop = True
        txtTroquelRp3.ReadOnly = False

        quitarError("txtCoberturaRp3", idErrorCoberturaRp3)
        idErrorCoberturaRp3 = -1

        calcularImportes()

    End Sub

    Private Sub btnBuscarRp1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscarRp1.Click
        medicamentoBuscado = medicamentoRp1
        abrirBusqueda("")
    End Sub

    Private Sub btnBuscarRp2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscarRp2.Click
        medicamentoBuscado = medicamentoRp2
        abrirBusqueda("")
    End Sub

    Private Sub btnBuscarRp3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscarRp3.Click
        medicamentoBuscado = medicamentoRp3
        abrirBusqueda("")
    End Sub

    Private Sub btnBuscarMedico_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscarMedico.Click
        Dim busquedaMedico As New frmBuscarMedico
        busquedaMedico.frmLlamada = Me.Name
        busquedaMedico.ShowDialog()
    End Sub

#End Region

#Region "Botónes"

    Private Sub Cancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
        Limpiar()
    End Sub

    Private Sub Limpiar()

        For Each crl As Control In Me.Controls
            If TypeOf crl Is TextBox Or TypeOf crl Is RichTextBox Or TypeOf crl Is MaskedTextBox Then
                crl.Text = ""
            End If
        Next

    End Sub

    Private Sub Guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGuardar.Click

        If recetaId = -1 Then
            'La receta todavía no está guardada
            guardarReceta()
            frmListadoRecetas.cargarGrilla()
            frmListadoRecetas.Show()
            frmListadoRecetas.cargarGrilla()
            Me.Dispose()
        Else
            'La receta ya fue guardada, por lo que actualizamos la misma
            'actualizarReceta()
        End If

    End Sub

    Private Sub btnErrores_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnErrores.Click

        'If recetaId = -1 Then
        '    'La receta todavía no está guardada
        '    guardarReceta()
        'End If
        Dim cargaErrores As New frmCargarErrores()
        cargaErrores.frmLlamada = Me.Name
        cargaErrores.ShowDialog()

        'Limpiamos los errores y volvemos a cargarlos
        manejadorErrores.Clear()
        'Cargamos los errores
        For Each errorReceta As DataRow In tablaErroresReceta.Rows
            Dim s As String = errorReceta("UbicacionErrorRecetaNombre")
            ubicarError(New ErrorFormulario(errorReceta("UbicacionErrorRecetaNombre"), errorReceta("ErrorRecetaMotivo"), errorReceta("TipoErrorRecetaNombre")))
        Next

    End Sub

#End Region



    Private Sub guardarReceta()
        'Guardamos los datos de la receta y el id generado
        recetaId = RecetaDAO.insertarReceta(txtCodigoReceta.Text, txtFechaReceta.Text, txtFechaVenta.Text, txtNumeroAfiliado.Text, txtNombreAfiliado.Text, "", txaDatosQuienRetira.Text, medico.Id, presentacionId)

        'Guardamos el detalle rp1
        If Not medicamentoRp1 Is Nothing Then
            'Guardamos el detalle rp2
            detalleRecetaRp1Id = DetalleRecetaDAO.insertarDetalleReceta(medicamentoRp1.Importe, 0, txtCoberturaRp1.Text, txtCantidadRp1.Text, 1, medicamentoRp1.Id, recetaId)
        End If
        If Not medicamentoRp2 Is Nothing Then
            'Guardamos el detalle rp2
            detalleRecetaRp2Id = DetalleRecetaDAO.insertarDetalleReceta(medicamentoRp2.Importe, 0, txtCoberturaRp2.Text, txtCantidadRp2.Text, 2, medicamentoRp2.Id, recetaId)
        End If
        If Not medicamentoRp3 Is Nothing Then
            'Guardamos el detalle rp3
            detalleRecetaRp3Id = DetalleRecetaDAO.insertarDetalleReceta(medicamentoRp3.Importe, 0, txtCoberturaRp3.Text, txtCantidadRp3.Text, 3, medicamentoRp3.Id, recetaId)
        End If

        'Guardamos los errores de la receta
        For Each errorReceta As DataRow In tablaErroresReceta.Rows
            ErrorRecetaDAO.insertarErrorReceta(errorReceta("ErrorRecetaMotivo"), errorReceta("ErrorRecetaCorreccion"), errorReceta("ErrorRecetaCorregido"), 1, errorReceta("TipoErrorRecetaId"), recetaId)
        Next

        If tablaErroresReceta.Rows.Count > 0 Then
            If MsgBox("Desea notificar a la farmacia vía email los errores de la receta?", MsgBoxStyle.YesNo, "Avisar errores") = MsgBoxResult.Yes Then
                Dim errores As String = ""
                For Each ErrorReceta As DataRow In tablaErroresReceta.Rows
                    errores = errores + "- " + ErrorReceta("ErrorRecetaMotivo") + vbCrLf
                Next
                Mail.enviarMailErroresReceta("mailFarmacia", txtCodigoReceta.Text, ObraSocialXPlanDAO.comboObraSocialXPlan_obtenerXId(obraSocialXPlanId).Rows(0)("Descripcion"), errores)
                MsgBox("El correo ha sido enviado exitosamente", MsgBoxStyle.Information, "Atención")
            End If
        End If

        MsgBox("La receta se ha guardado con éxito", MsgBoxStyle.Information, "Atención")
    End Sub
#Region "Manejo de errores"
    Private Sub actualizarReceta()
        'Actualizamos los datos de la receta y el id generado
        recetaId = RecetaDAO.actualizarReceta(recetaId, txtCodigoReceta.Text, txtFechaReceta.Text, txtFechaVenta.Text, txtNumeroAfiliado.Text, txtNombreAfiliado.Text, "", txaDatosQuienRetira.Text, medico.Id, estadoReceta, presentacionId)

        'Actualizamos, Eliminamos o Insertamos los detalles según corresponda
        If Not medicamentoRp1 Is Nothing Then
            'Actualizamos el detalle rp1
            DetalleRecetaDAO.actualizarDetalleReceta(detalleRecetaRp1Id, txtPrecioRp1.Text, 0, txtCoberturaRp1.Text, txtCantidadRp1.Text, 1, medicamentoRp1.Id, recetaId)
        ElseIf detalleRecetaRp1Id = -1 Then
            'Guardamos el detalle rp1
            detalleRecetaRp1Id = DetalleRecetaDAO.insertarDetalleReceta(medicamentoRp1.Importe, 0, txtCoberturaRp1.Text, txtCantidadRp1.Text, 1, medicamentoRp1.Id, recetaId)
        Else
            'Eliminamos el detalle rp1
            DetalleRecetaDAO.eliminarDetalleReceta(detalleRecetaRp1Id)
        End If

        If Not medicamentoRp2 Is Nothing Then
            'Actualizamos el detalle rp2
            DetalleRecetaDAO.actualizarDetalleReceta(detalleRecetaRp2Id, txtPrecioRp2.Text, 0, txtCoberturaRp2.Text, txtCantidadRp2.Text, 2, medicamentoRp2.Id, recetaId)
        ElseIf detalleRecetaRp1Id = -1 Then
            'Guardamos el detalle rp2
            detalleRecetaRp2Id = DetalleRecetaDAO.insertarDetalleReceta(medicamentoRp2.Importe, 0, txtCoberturaRp2.Text, txtCantidadRp2.Text, 2, medicamentoRp2.Id, recetaId)
        Else
            'Eliminamos el detalle rp2
            DetalleRecetaDAO.eliminarDetalleReceta(detalleRecetaRp2Id)
        End If

        If Not medicamentoRp3 Is Nothing Then
            'Actualizamos el detalle rp3
            DetalleRecetaDAO.actualizarDetalleReceta(detalleRecetaRp3Id, txtPrecioRp3.Text, 0, txtCoberturaRp3.Text, txtCantidadRp3.Text, 3, medicamentoRp3.Id, recetaId)
        ElseIf detalleRecetaRp1Id = -1 Then
            'Guardamos el detalle rp3
            detalleRecetaRp3Id = DetalleRecetaDAO.insertarDetalleReceta(medicamentoRp3.Importe, 0, txtCoberturaRp3.Text, txtCantidadRp3.Text, 3, medicamentoRp3.Id, recetaId)
        Else
            'Eliminamos el detalle rp3
            DetalleRecetaDAO.eliminarDetalleReceta(detalleRecetaRp3Id)
        End If
    End Sub

    Private Function agregarErrorReceta(ByVal ErrorRecetaMotivo As String, ByVal ErrorRecetaCorreccion As String, ByVal ErrorRecetaCorregido As Boolean, ByVal TipoErrorRecetaId As Integer, ByVal TipoErrorRecetaNombre As String, ByVal UbicacionErrorRecetaNombre As String) As Integer
        Dim retorno As Integer = idError
        'ErrorRecetaId,ErrorRecetaMotivo, ErrorRecetaCorreccion, ErrorRecetaCorregido, EmpleadoId, TipoErrorRecetaId, RecetaId, TipoErrorRecetaNombre, UbicacionErrorRecetaNombre
        With tablaErroresReceta.Rows
            .Add(idError, ErrorRecetaMotivo, ErrorRecetaCorreccion, ErrorRecetaCorregido, 1, TipoErrorRecetaId, recetaId, TipoErrorRecetaNombre, UbicacionErrorRecetaNombre)
        End With
        ubicarError(New ErrorFormulario(UbicacionErrorRecetaNombre, ErrorRecetaMotivo, TipoErrorRecetaNombre))
        idError = idError + 1
        Return retorno
    End Function

    Private Sub ubicarError(ByVal e As ErrorFormulario)
        Dim c As Control
        c = BuscaControl(e.UbicacionErrorReceta, Me)
        manejadorErrores.SetError(c, e.TipoErrorRecetaNombre & vbCrLf & e.ErrorRecetaMotivo)

    End Sub

    Private Sub quitarError(ByVal componente As String, ByVal idError As Integer)
        Dim c As Control
        c = BuscaControl(componente, Me)
        manejadorErrores.SetError(c, "")

        For Each fila As DataRow In tablaErroresReceta.Rows
            If fila("ErrorRecetaId") = idError Then
                tablaErroresReceta.Rows.Remove(fila)
                Exit For
            End If
        Next
    End Sub

    Private Function BuscaControl(ByVal Nombre As String, ByVal Contenedor As Control) As Control
        Dim c As Control = Nothing
        'Recorremos la colección de Controles del Contenedor
        For Each ctrl As Control In Contenedor.Controls
            'Comparamos el nombre del control con el nombre que buscamos
            'Hace la comparación en mayusculas.
            If UCase(ctrl.Name) = UCase(Nombre) Then
                'Ha sido encontrado. Asignamos el control encontrado y salimos del for
                Return ctrl
            End If
            'El control actual es un contenedor?
            If ctrl.HasChildren Then
                'HasChildren = True. Es contenedor
                'Buscar recursivamente en este control
                c = BuscaControl(Nombre, ctrl)
                If Not (c Is Nothing) Then 'Se ha encontrado el control?
                    'Ha sido encontrado. Asignamos el control encontrado y salimos del for
                    Return c
                End If
            End If
        Next
        'c tiene el control encontrado o bien tiene Nothing
        Return c
    End Function

#End Region

    Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click
        frmListadoRecetas.Show()
        Me.Close()
    End Sub

End Class